/**  
* @Title: TreeUtil.java 
* @Package com.success.common.utils 
* @Description: TODO 
* @author A18ccms A18ccms_gmail_com  
* @date 2015-8-13 上午11:46:47 
* @version V1.0  
*/ 

package com.swn.common.util;

import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/** 
 * @ClassName: TreeUtil 
 * @Description: 主要对树形结构的处理

 */

public class TreeUtil {
	
	// 显示的属性结构的最高的节点
	private static String maxParId;
	
	/**
	 * 创建一颗树，以json字符串形式返回
	 * 
	 * @param list
	 *            原始数据列表
	 * @return 树
	 */
	@SuppressWarnings("unused")
	private static String createTreeJson(List<JSONTree> list) {
		JSONArray rootArray = new JSONArray();
		for (int i = 0; i < list.size(); i++) {
			JSONTree jsonTree = list.get(i);
			if (jsonTree.getParentId().equalsIgnoreCase("0")) {
				JSONObject rootObj = createBranch(list, jsonTree);
				rootArray.add(rootObj);
			}
		}
		return rootArray.toString();
	}
	
	/**
	 * 递归创建分支节点Json对象
	 * 
	 * @param list
	 *            创建树的原始数据
	 * @param jsonTree
	 *            当前节点
	 * @return 当前节点与该节点的子节点json对象
	 */
	private static JSONObject createBranch(List<JSONTree> list, JSONTree jsonTree) {
		/* 将javabean对象解析成为JSON对象 */
		JSONObject currentObj = JSONObject.fromObject(jsonTree);
		JSONArray childArray = new JSONArray();

		/*
		 * 循环遍历原始数据列表，判断列表中某对象的父id值是否等于当前节点的id值，
		 * 如果相等，进入递归创建新节点的子节点，直至无子节点时，返回节点，并将该节点放入当前节点的子节点列表中
		 */
		for (int i = 0; i < list.size(); i++) {
			JSONTree newNode = list.get(i);
			if(!"0".equals(newNode.getParentId())&& newNode.getParentId().equals(jsonTree.getId())){
				JSONObject childObj = createBranch(list, newNode);
				childArray.add(childObj);
			}
		}
		/* 判断当前子节点数组是否为空 将子节点数组加入children字段中 */
		if (!childArray.isEmpty())
			currentObj.put("children", childArray);
		return currentObj;
	}
	
	/**
	 * 
	 * @Title: getJsonTreeByMap 
	
	 * @Description: TODO(根据Map集合获取tree的json串) 
	
	 * @param @param list
	 * @param @param maxParId
	 * 				 显示的属性结构的最高的节点
	 * @param @return    设定文件
	
	 * @return String    返回类型
	
	 * @throws
	 */
	public static String getJsonTreeByMap(List<Map<String, Object>> list,String maxParId){
		TreeUtil.maxParId = maxParId;
		JSONArray rootArray = new JSONArray();
		for (int i = 0; i < list.size(); i++) {
			Map<String, Object> menuMap = list.get(i);
			if (menuMap.get("parentId").equals(maxParId)) {
				JSONObject rootObj = createBranchByMap(list, menuMap);
				rootArray.add(rootObj);
			}
		}
		return rootArray.toString(); 
	}
	
	/**
	 * 递归创建分支节点Json对象,根据Map集合
	 * 
	 * @param list
	 *            创建树的原始数据
	 * @param jsonTree
	 *            当前节点
	 * @return 当前节点与该节点的子节点json对象
	 */
	private static JSONObject createBranchByMap(List<Map<String, Object>> list, Map<String, Object> menuMap) {
		/* 将javabean对象解析成为JSON对象 */
		JSONObject currentObj = JSONObject.fromObject(menuMap);
		JSONArray childArray = new JSONArray();

		/*
		 * 循环遍历原始数据列表，判断列表中某对象的父id值是否等于当前节点的id值，
		 * 如果相等，进入递归创建新节点的子节点，直至无子节点时，返回节点，并将该节点放入当前节点的子节点列表中
		 */
		for (int i = 0; i < list.size(); i++) {
			Map<String, Object> menuMapCh = list.get(i);
			if(!maxParId.equals(menuMapCh.get("parentId"))&& menuMapCh.get("parentId").equals(String.valueOf(menuMap.get("id")))){
				JSONObject childObj = createBranchByMap(list, menuMapCh);
				childArray.add(childObj);
			}
		}
		/* 判断当前子节点数组是否为空 将子节点数组加入children字段中 */
		if (!childArray.isEmpty())
			currentObj.put("children", childArray);
		return currentObj;
	}
}
